package validator

import (
	"fmt"
	"ginblog/enum"
	// 中文包
	"github.com/go-playground/locales/zh_Hans_CN"
	// 翻译包
	unTrans "github.com/go-playground/universal-translator"
	// validator包
	"github.com/go-playground/validator/v10"
	// 中文翻译包
	zhTrans "github.com/go-playground/validator/v10/translations/zh"
	"reflect"
)

// Validate 全局验证，如果只需要某个一模型的验证的话，
// 可以将这个函数定义为对应模型的方法，any：代表interface{}
func Validate(data any) (string, enum.Code) {
	// 实例化validate
	validate := validator.New()
	// 实例化中文翻译，指定需要转化为汉语中文
	uni := unTrans.New(zh_Hans_CN.New())
	// 引入翻译方法的包
	trans, _ := uni.GetTranslator("zh_Hans_CN")

	// 注册翻译方法
	err := zhTrans.RegisterDefaultTranslations(validate, trans)
	if err != nil {
		fmt.Println("err:", err)
	}
	// 注册一个函数，获取struct tag里自定义的label作为字段名
	validate.RegisterTagNameFunc(func(field reflect.StructField) string {
		label := field.Tag.Get("label")
		return label
	})

	// 验证是传入的结构体
	err = validate.Struct(data)

	// 判断验证是否通过
	if err != nil {
		for _, v := range err.(validator.ValidationErrors) {
			return v.Translate(trans), enum.ERROR
		}
	}
	return "", enum.SUCCESS
}
